/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package algoritmos_busqueda;

/**
 *
 * @author stbn
 */

import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.Icon;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JOptionPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Cuadrado extends JButton{

    private int dificultad = 1;
    private boolean esOrigen;
    private boolean esDestino;
    private int posx;
    private int posy;
    private Cuadrado predecesor;
    private int g = 0;
    private int h = 0;
    private int f = 0;
    private int[] claveLP = {0,0};
    private int rhs = 0;

    private Icon iconos [] =
            {
                new ImageIcon(getClass().getResource("inicio.gif")),
                new ImageIcon(getClass().getResource("cuadrado0.gif")),
                new ImageIcon(getClass().getResource("cuadrado10.gif")),
                new ImageIcon(getClass().getResource("fin.gif")),
                new ImageIcon(getClass().getResource("camino.gif")),
                new ImageIcon(getClass().getResource("personaje.gif"))

            };

    public Cuadrado(int x, int y)
    {
        super.setIcon(iconos[1]);

        esOrigen = false;
        esDestino = false;
        posx=x;
        posy=y;


        addKeyListener(
                new KeyAdapter()
                {
                    public void  keyTyped(KeyEvent evento)
                    {
                        String pulsacion = String.valueOf(evento.getKeyChar());
                        
                        Ventana.dificultadactual = Integer.parseInt(pulsacion);
                        //JOptionPane.showMessageDialog(null, Ventana.dificultadactual);
                    }

                }
            );

         addActionListener(
                new ActionListener()
                 {
                    public void actionPerformed(ActionEvent evento)
                     {
                        int opcion = Ventana.dificultadactual;
                        //JOptionPane.showMessageDialog(null, String.format("Posicion %d %d", posx, posy));
                        if (opcion == 6) JOptionPane.showMessageDialog(null, String.format("Valores %d %d", claveLP[0], claveLP[1]));
                        if (opcion == 4) JOptionPane.showMessageDialog(null, String.format("Cuadrado %d %d,Predecesor en %d %d", posx, posy, predecesor.obtenerx(), predecesor.obtenery()));
                        if (opcion == 5)
                        {
                            JOptionPane.showMessageDialog(null, String.format("Valor G = %d \n Valor H = %d \n Valor F = %d", g, h, f));
                        }


                        switch(opcion)
                        {
                            case 0: Cuadrado.super.setIcon(iconos[0]);
                            asignarorigen();
                            break;
                            case 1: Cuadrado.super.setIcon(iconos[1]);
                            asignarcamino();
                            break;
                            case 2: Cuadrado.super.setIcon(iconos[2]);
                            asignarobstaculo();
                            break;
                            case 3: Cuadrado.super.setIcon(iconos[3]);
                            asignardestino();
                            break;
                            default: Cuadrado.super.setIcon(iconos[0]);
                            asignarcamino();
                            break;
                        }
                     }
                }
            );

    }

    //Declaracion de funciones necesarias
    public boolean esOrigen()
    {
        return esOrigen;
    }

    public boolean esDestino()
    {
        return esDestino;
    }

    public boolean esCamino()
    {
        return (!esOrigen && !esDestino && dificultad == 0);
    }

    public boolean esobstaculo()
    {
        return (!esOrigen && !esDestino && dificultad == 10);
    }

    public void asignarorigen()
    {
        esOrigen = true;
        esDestino = false;
        dificultad=1;
    }

    public void asignarcamino()
    {
        esOrigen = false;
        esDestino = false;
        dificultad=1;
    }

    public void asignarobstaculo()
    {
        esOrigen = false;
        esDestino = false;
        dificultad=10;
    }
    

    public void asignardestino()
    {
        esOrigen = false;
        esDestino = true;
        dificultad=1;
    }

    public int obtenerDificultad()
    {
        return dificultad;
    }

    public int obtenerx()
    {
        return posx;
    }

    public int obtenery()
    {
        return posy;
    }

    public void establecerpredecesor(Cuadrado c)
    {
        predecesor = c;
    }

    public Cuadrado obtenerpredecesor()
    {
        return predecesor;
    }

    public void pintar(int opcion)
    {
        switch (opcion)
        {
            case 0: Cuadrado.super.setIcon(iconos[1]); break;
            case 1: Cuadrado.super.setIcon(iconos[4]); break;
            case 2: Cuadrado.super.setIcon(iconos[5]); break;

        }
        
    }

    public void actualizarIcono(Cuadrado c)
    {
        super.setIcon(c.getIcon());
    }

    public void limpiar()
    {
        esOrigen = false;
        esDestino = false;
        dificultad=0;
        predecesor = null;
        Cuadrado.super.setIcon(iconos[1]);
    }

    public void establecerG(int valor)
    {
        g = valor;
        //f = g + h;
    }

    public void establecerH(int valor)
    {
        h = valor;
        //g = g + h;
    }

    public void establecerF(int valor)
    {
        f = valor;
    }

    public int obtenerF()
    {
        return f;
    }

    public int obtenerG()
    {
        return g;
    }

    public int obtenerH()
    {
        return h;
    }

    public int[] obtenerclaveLP()
    {
        //JOptionPane.showMessageDialog(null, String.format("Valores %d %d", claveLP[0], claveLP[1]));
        //System.out.println(String.format("Valores %d %d", claveLP[0], claveLP[1]));
        return claveLP;
    }

    public void establecerClaveLP(int[]valor)
    {
        claveLP = valor;
    }

    public int obtenerrhs()
    {
        return rhs;
    }

    public void establecerrhs(int valor)
    {
        rhs = valor;
    }

    public boolean equals(Object o)
    {
        //if ( this == o ) return true;

    //use instanceof instead of getClass here for two reasons
    //1. if need be, it can match any supertype, and not just one class;
    //2. it renders an explict check for "that == null" redundant, since
    //it does the check for null already - "null instanceof [type]" always
    //returns false. (See Effective Java by Joshua Bloch.)
    if ( !(o instanceof Cuadrado) ) return false;
    //Alternative to the above line :
    //if ( aThat == null || aThat.getClass() != this.getClass() ) return false;

    //cast to native object is now safe
    Cuadrado c = (Cuadrado)o;

    //now a proper field-by-field evaluation can be made
    return ((this.obtenerx() == c.obtenerx()) && (this.obtenery() == c.obtenery()));
    }




    

}
